// 函数的两种写法：1.函数的定义  2.函数表达式

// 1.函数定义  
function hello(name: string): void {
    console.log('hello', name);
}
hello('zhufeng');


// 2.定义函数类型
// 定义GetName类型  传入 第一名称  第二名称  返回 字符串
type GetName = (firstName: string, lastName: string) => string;


// 实例化函数 getName：类型为GetName  对应参数
let getName: GetName = function (firstName: string, lastName: string): string {
    // 后续操作
    return firstName + lastName
    // 当不需要返回值时,只需要将上方函数的 返回的类型指定为void即可
}




// 可选参数  ?: 表示可选  可以传值也可以不传
function print(name: string, age?: number): void {
    console.log(name, age);
}
// 此处的age(11) 可以传  也可以不传
print('zhufeng', 11);


// 默认参数(不给默认值的参数则为必传)
function ajax(url: string, method: string = "GET") {
    console.log(url, method);
}
ajax('/');  // 打印  / GET
ajax('/', 'POST'); // 打印 / POST


// 剩余参数
function sum(...numbers: number[]) {
    return numbers.reduce((val, item) => val + item, 0)
}
console.log(sum(1, 2, 3));   //6

// 函数的重载
let obj: any = {};
// 规定函数参数类型为字符串:重载一次
function attr(val: string,val2:string): void
// 规定函数参数类型为number:重载两次
function attr(val: number,val2:number): void

function attr(a:string|number,b:string|number):void{

}

attr(1,2)
attr('name','age')
// attr('name',17)  此处报错,因为函数声明 只声明了 都为字符串 或者 都为数字的情况，其他情况没有列出,所以此处不生效


// 函数重载案例:compose  

// 函数重载的目的：是为了规范化函数中的传参类型,只能由已声明类型的模式来传参,其他传参方式都会出现错误.